/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package hyperbeam.Graficos;
import java.awt.image.*;
import java.io.*;
import java.io.IOException;
import hyperbeam.Figuras.Color;

/**
 *
 * @author Programmer
 */
public class EscritorImagenes {
    public static BufferedImage imagen = null;

    /**
     * Inicializa la imagen estatica
     * @param ancho
     * @param alto
     */
    public static void inicializarImagen(int ancho, int alto){
        imagen = new BufferedImage(ancho, alto, BufferedImage.TYPE_INT_RGB);
    }

    /**
     * Hace un set del pixel
     * @param x
     * @param y
     * @param color
     */
    public static void setPixel(int ancho, int alto, hyperbeam.Figuras.Color color) throws Exception{
        if (imagen != null && ancho < imagen.getWidth() && alto < imagen.getHeight()){
            imagen.setRGB(ancho, alto, new java.awt.Color(color.getRed(), color.getGreen(), color.getBlue()).getRGB());
        }
        else{
            throw new Exception("El pixel seleccionado no existe");
        }
    }

    public static void setPixel(int ancho, int alto, java.awt.Color color) throws Exception{
        if (imagen != null && ancho < imagen.getWidth() && alto < imagen.getHeight()){
            imagen.setRGB(ancho, alto, color.getRGB());
        }
        else{
            throw new Exception("El pixel seleccionado no existe");
        }
    }

    public static void setPixel(int ancho, int alto, int red, int green, int blue) throws Exception{
        if (imagen != null && ancho < imagen.getWidth() && alto < imagen.getHeight()){
            imagen.setRGB(ancho, alto, new java.awt.Color(red, green, blue).getRGB());
        }
        else{
            throw new Exception("El pixel seleccionado no existe");
        }
    }

    /**
     * Hace una copia del buffer y lo graba en la imagen
     * @param buffer
     * @throws Exception
     */
    public static void setImage(hyperbeam.Figuras.Color[][] buffer) throws Exception {
        int ancho = buffer.length;
        int alto  = buffer[0].length;

        hyperbeam.Figuras.Color color;
        java.awt.Color conversor = java.awt.Color.BLUE;
        for (int indexFil = 0; indexFil < ancho; indexFil++){
            for (int indexCol = 0; indexCol < alto; indexCol++){
                color = buffer[indexFil][indexCol];
                conversor = new java.awt.Color(color.getRed(), color.getGreen(), color.getBlue());
                imagen.setRGB(indexFil, indexCol, conversor.getRGB());
            }
       }
    }


    /**
     * Retorna la instancia de la imagen
     * @return
     */
    public static BufferedImage getImage(){
        return imagen;
    }

    /**
     * Develve el color de un pixel
     * @param ancho
     * @param alto
     * @return
     */
    public static hyperbeam.Figuras.Color getPixel(int ancho, int alto)throws Exception{
        hyperbeam.Figuras.Color color = new Color();
        if (imagen != null && ancho < imagen.getWidth() && alto < imagen.getHeight()){
            java.awt.Color col =new java.awt.Color(imagen.getRGB(ancho, alto),true);
            color.setBlue ((byte)col.getBlue());
            color.setRed  ((byte)col.getRed());
            color.setGreen((byte)col.getGreen());
            return color;
        }
        else{
            throw new Exception("El pixel seleccionado no existe");
        }
    }

    /**
     * Salva como una imagen
     * @param filename
     */
    public static void salvarJPG(String filename) throws IOException{
        if (imagen != null){
            javax.imageio.ImageIO.write(imagen, "jpg", new File(filename));
        }
        else{
            throw new IOException("La imagen no existe");
        }
    }
}
